#pragma once
#include<thread>
#include <sys/types.h>       
#include <sys/socket.h>
#include <signal.h>
#include "ThreadPool.hpp"
#include "Tcpserver.hpp"
#include "Util.hpp"

#define default_port 8080

class Httpserver
{
    public:
    Httpserver(int port=default_port)
    :port_(port)
    ,stop_(false)
    {}
    void Init_Server()
    {
        signal(SIGPIPE,SIG_IGN);
    }

    //运行服务的主函数
    void Loop()
    {
        int fd=open("./Log.text",O_CREAT | O_RDWR);
        dup2(fd,2);
        static Tcpserver* Tcp=Tcpserver::Getinstance(port_);
        
        LOG(INFO,"Create Tcp success:....");
        while(!stop_)
        {
            int listen_fd=Tcp->Sock();
            //int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
            struct sockaddr_in peer;
            socklen_t len=sizeof(peer);
            int accept_sock=accept(listen_fd,(sockaddr*)&peer,&len);
            if(accept_sock < 0) continue;
            LOG(INFO,"Get new link...");
            //准备读取报文，并且开始解析报头.
            //可能的理由是多线程环境下参数传递的问题。
            // 当使用pthread_create等函数创建线程时，传递的参数是一个void*指针。
            // 如果直接传递int的值，需要进行类型转换，将int转为void*，
            // 这在64位系统上可能没问题（因为指针是64位，而int通常是32位），
            // 但存在潜在的问题，因为将int转void*并不安全，可能引起截断或未定义行为。
            // 而另一种方法是动态分配一个int，传递其指针，这样保证指针的有效性，
            // 线程函数在使用后释放内存，避免内存泄漏。
           int* sock=new int(accept_sock);
           //开始采用多个线程一起处理.
        //    std::thread t1( Entrace::HandlerRequese,(void*)sock);
        //     t1.detach();
            Task task(*sock);
            auto pool=ThreadPool::Getinstance();
            pool->Push_Task(task);
        }
    }

    private:
    int port_;
    bool stop_;
};
